package zrpc

import (
	"bytes"
	"encoding/gob"
)

/**
	自定义RPC参数、结果
*/
type RpcArgsRes struct {
	Cmd uint16		// 命令
	Data []byte		// 数据
	Error string	// 错误信息
}
// 压缩Data
func (this*RpcArgsRes)EncodeData(data interface{}){
	buf := new(bytes.Buffer)
	enc := gob.NewEncoder(buf)
	err := enc.Encode(data)
	if err == nil{
		this.Data = buf.Bytes()
	}
}
// 创建相同的Cmd对象
func (this*RpcArgsRes)NewRpcArgsRes() *RpcArgsRes{
	res := &RpcArgsRes{
		Cmd:this.Cmd,
	}
	return res
}
// data to string
func (this*RpcArgsRes)Data2String() string{
	data := ""
	this.DecodeData(&data)
	return data
}
// data to int
func (this*RpcArgsRes)Data2Int() int{
	data := 0
	this.DecodeData(&data)
	return data
}
// data to bool
func (this*RpcArgsRes)Data2Bool() bool{
	data := false
	this.DecodeData(&data)
	return data
}
// 解析data
func (this*RpcArgsRes)DecodeData(data interface{}){
	buf := new(bytes.Buffer)
	buf.Write(this.Data)
	dec := gob.NewDecoder(buf)
	dec.Decode(data)
}

func NewRpcArgsRes(cmd uint16,data interface{}) *RpcArgsRes {
	rpc := &RpcArgsRes{
		Cmd:cmd,
	}
	buf := new(bytes.Buffer)
	enc := gob.NewEncoder(buf)
	err := enc.Encode(data)
	if err== nil{
		rpc.Data = buf.Bytes()
	}
	return rpc
}
func ReturnRpcArgsRes(res interface{}) *RpcArgsRes {
	return res.(*RpcArgsRes)
}

type ServiceImpl struct {
}
func (this *ServiceImpl)OnRpcMessage(args *RpcArgsRes) *RpcArgsRes  {
	return args
}